import { AxiosError } from 'axios';
import storage from 'store';
import NProgress from 'nprogress';
import { ElNotification } from 'element-plus';
import router from '@/router';
import { useUserStore } from '@/stores/user';
import { setTitle } from '@/libs/utils';

// 进度条
import 'nprogress/nprogress.css';

const loginRoutePath = '/login';
const ssoRoutePath = '/sso_login';
const defaultRoutePath = '/main';

const { VITE_LOGIN_MODE } = import.meta.env;
const pageName = VITE_LOGIN_MODE === 'SSO' ? 'Sso' : 'Login';

/**
 * 路由拦截
 * 权限验证
 */
router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore();
  // 进度条
  NProgress.start();
  // 验证当前路由所有的匹配中是否需要有登录验证的
  if (to.matched.some((r) => r.meta.auth)) {
    const token = storage.get('ACCESS_TOKEN');
    // 是否存有token作为验证是否登录的条件
    if (token && token !== 'undefined') {
      await userStore
        .verification(token)
        .then(() => {
          // 是否处于登录页面
          if (to.path === loginRoutePath || to.path === ssoRoutePath) {
            next({ path: defaultRoutePath });
            // 查询是否储存用户信息
          } else {
            next();
          }
        })
        .catch((error: AxiosError) => {
          // 失败信息会返回到这里，如果是未登录，跳转到登录页，其他错误不跳转
          // @ts-ignore
          const code = error.response?.data.code;
          if (code === 401) {
            next({ name: pageName });
          } else {
            next();
          }
        });
    } else {
      ElNotification.error({ title: '请求错误', message: '请先登录' });
      // 没有登录的时候跳转到登录界面； 携带上登录成功之后需要跳转的页面完整路径
      next({
        name: pageName,
        query: {
          redirect: to.fullPath,
        },
      });
    }
  } else if (VITE_LOGIN_MODE === 'SSO' && to.path === loginRoutePath) {
    // 如果当前不需要验证的页面是本地登录页，且是单点登录，则需要改为单点登录的页面
    next({ path: ssoRoutePath });
  } else {
    // 不需要身份校验 直接通过
    next();
  }
});

router.afterEach((to) => {
  // 进度条
  NProgress.done();
  setTitle(to.meta.title as string);
});
